The development, proofing, documentation and maintenance of computer programs for complex data-processing systems represents a difficult and increasingly costly aspect of modern systems design, especially for those systems requiring real-time processing. The problem is aggravated by the absence of a lucid means of representing the operations performed by the program or its internal and external interfaces and the associated communication gap between engineers and programmers.
General purpose digital computers have been applied with great success to problems in scientific and engineering analysis requiring highly complex mathematical calculations, and for economically storing large masses of data sorted in a way that permits almost instantaneous retrieval of a particular set of data. A third application of great importance has been the automation of operating systems.
The problems associated with these three applications of general purpose digital computers are fundamentally very different. A computer as a high speed mathematical calculator involves the transformation of a set of given parameters by a sequence of specific mathematical transformations into one or a set of solutions. The storage and retrieval of data involves the organization of a filing system with suitable indexing to facilitate rapid location of the data to be retrieved. In the use of a computer to automate portions of a complex system the primary processes are the correlation and classification of data inputs, recognition of significant events or changes in input conditions to the system, and translation of these into concise information outputs or actual control signals to external devices.
The design of computer programs for using digital computers for automating real-time operating systems has turned out to be quite different and much more difficult than designing programs for computing and data-handling applications. Thus, the enormous potential impact of the use of modern digital computers in automating such systems has been impeded by the very large expenditure of manpower, and hence of time and money, in the design of satisfactory large-scale computer programs. In many instances the development of the so-called "software" (in contrast to the "hardware", or equipment) is widely regarded as the limiting factor in both time and cost of system development.
The main task in effectively using a general-purpose computer in a given application is the development of a satisfactory computer program. Since the individual operations of the central processing unit are very elementary, a relatively long sequence of instructions must be written to accomplish most data-processing tasks. Accordingly, since the program in assembly code requires a separate instruction for each elementary machine instruction, it is very laborious to use in designing complex programs. For this reason several "programming languages" have been developed which enable the programmer to write concise "higher level" instructions. This involves development of a program called a "compiler", which translates the high-level instructions into the assembly code for a given computer. Since much of the detailed housekeeping is done by the compiler, the programmer's task is greatly facilitated.
While existing high level languages are very helpful in programming computers for use in mathematical analysis and business applications, they do not lend themselves to the design of real-time programs for complex automated systems. In such applications the program has to provide for accessing and outputting data at times required by the system timing, and must have a system of priorities which interrupts lengthy operations in favor of those requiring immediate action. The higher level languages obscure the relation between the operation called for and the time required for its execution, and thus can inadvertently produce a program which later proves to require unacceptably long processing times. "Timing" in scientific or business programs generally only affects cost. In high-data-rate real-time systems timing may control success or failure.
Further, automated systems must often accommodate large variations in the volume and rate of data inputs and in their quality or noise content. The use of existing high level programming languages obscures the memory requirement for storing the program code and data. The resulting inefficient use of memory and time, by a factor as high as three, is often a limiting factor in data handling capacity. In such systems the use of assembly language is more satisfactory in insuring that the program meets all system requirements, despite the increased labor involved in the detailed coding. These characteristics make the design of computer programs for real-time systems vastly more difficult and tedious than the preparation of programs for batch-type computational tasks.
An even more basic difficulty in the preparation of computer programs for automated systems is the communication gap between the engineers and the programmers. The design specifications for the program are prepared by engineers to fit the characteristics of the data inputs and the rate and accuracy requirements of the processed outputs. At the time he has to prepare the specifications the engineer cannot estimate reliably the complexity of the program that will result. The programmer, in turn, has little discretion in altering the specifications to meet the limitations on computer capacity and processing times. Accordingly, the development of a computer program for an automated system often results in an oversized and unbalanced product after an inordinate expenditure of effort and time.